package com.enlorenz.core.channel.common.msgutil;

import java.nio.ByteBuffer;

import com.enlorenz.common.util.CodeUtils;

/**
 * 字节消息打包
 * @author lcb
 */
public class ByteMsgPacker {
	//默认空
	public static final int DEFAULT_BLANK=0x00;
	//缓存
	private ByteBuffer byteBuffer;
	public ByteMsgPacker(int len){
		byteBuffer=ByteBuffer.allocate(len);
	}
	
	/**
	 * 放入int数据
	 * @param data
	 */
	public void putInt(int data){
		byteBuffer.put((byte)data);
	}
	
	
	/**
	 * 放入byte数组
	 * @param buff
	 */
	public void putByteArr(byte [] buff){
		byteBuffer.put(buff);
	}
	
	/**
	 * 放入指定数量的int
	 * @param data
	 */
	public void putIntSize(int data,int size){
		for(int i=0;i<size;i++){
			putInt(data);
		}
	}
	
	/**
	 * 放入空数据
	 */
	public void putBlank(){
		putInt(DEFAULT_BLANK);
	}
	
	/**
	 * 放入指定数量的空数据
	 * @param size
	 */
	public void putBlank(int size){
		putIntSize(DEFAULT_BLANK, size);
	}
	
	
	/**
	 * 将数字转换为16进制byte数组
	 * @param num
	 */
	public void putNum2Hex2Byte(int num){
		byteBuffer.put(getNum2Hex2Byte(num));
	}
	
	/**
	 * 将数字转换为16进制byte数组 左补充空白
	 * @param num
	 */
	public void putNum2Hex2ByteLeftBlank(int num,int fixedLen){
		appendBlankLeft(getNum2Hex2Byte(num),fixedLen);
	}
	
	/**
	 * 将数字转换为16进制byte数组 右补充空白
	 * @param num
	 */
	public void putNum2Hex2ByteRightBlank(int num,int fixedLen){
		appendBlankRight(getNum2Hex2Byte(num),fixedLen);
	}
	
	
	
	/**
	 * 获取String的bytes数组
	 * @param str
	 * @return
	 */
	public byte [] getStringBytes(String str){
		return str.getBytes();
	}
	
	/**
	 * 获取String的bytes数组
	 * @param str
	 * @return
	 */
	public byte [] getStringBytes(String str,String encoding) throws Exception{
		return str.getBytes(encoding);
	}
	
	/**
	 * 放入String的bytes数组
	 * @param str
	 * @return
	 */
	public void putStringBytes(String str){
		byteBuffer.put(getStringBytes(str));
	}
	/**
	 * 放入String的bytes数组 左补空白
	 * @param str
	 * @return
	 */
	public void putStringBytesLeftBlank(String str,int fixedLen){
		appendBlankLeft(getStringBytes(str), fixedLen);
	}
	/**
	 * 放入String的bytes数组 右补空白
	 * @param str
	 * @return
	 */
	public void putStringBytesRightBlank(String str,int fixedLen){
		appendBlankRight(getStringBytes(str), fixedLen);
	}
	
	/**
	 * 放入String的bytes数组
	 * @param str
	 * @return
	 */
	public void putStringBytes(String str,String encoding) throws Exception{
		byteBuffer.put(getStringBytes(str,encoding));
	}
	
	/**
	 * 获取将数字转换为16进制byte数组
	 * @param num
	 * @return
	 */
	public byte[] getNum2Hex2Byte(int num){
		String hexString=Integer.toHexString(num);
		if(hexString.length()%2 !=0){
			hexString="0"+hexString;
		}
		return CodeUtils.reverseByte(CodeUtils.hexString2Bytes(hexString));
	}
	
	/**
	 * 获取需要的空白
	 * @param buff
	 */
	public static byte [] getNeedBlank(byte [] buff,int fixedLen){
		if(buff.length>=fixedLen){
			return null;
		}
		
		int need=fixedLen-buff.length;
		byte [] blk=new byte[need];
		for(int i=0;i<blk.length;i++){
			blk[i]=DEFAULT_BLANK;
		}
		return blk;
	}
	
	/**
	 * 加入左空白
	 * @param buff
	 * @param fixedLen
	 * @return
	 */
	public void appendBlankLeft(byte [] buff,int fixedLen){
		byteBuffer.put(getNeedBlank(buff, fixedLen));
		byteBuffer.put(buff);
	}
	
	/**
	 * 加入右空白
	 * @param buff
	 * @param fixedLen
	 * @return
	 */
	public void appendBlankRight(byte [] buff,int fixedLen){
		byteBuffer.put(buff);
		byteBuffer.put(getNeedBlank(buff, fixedLen));
	}
	
	/**
	 * 输出数组
	 * @return
	 */
	public byte [] getArray(){
		byte [] output=new byte[byteBuffer.position()];
		System.arraycopy(byteBuffer.array(), 0, output, 0, output.length);
		return output;
	}
	
}
